package com.ucode.tool.util;

import java.util.concurrent.ConcurrentHashMap;
import cn.hutool.core.util.IdUtil;

/**
 * ID生成器工具类
 * 该工具类继承了hutool IdUtil类,请不要使用IdUtil中Snowflake生成Id部分
 * @author: liliang
 * @date: 2019年12月16日 下午8:10:31
 */
public class IdentifyUtils extends IdUtil{
    private static final ConcurrentHashMap<String, Snowflake> snowflakeMap = new ConcurrentHashMap<String, Snowflake>();
    //默认
    private static final Snowflake defaultSnowflake = new Snowflake();
    
    /**
     * 雪花算法生成的ID
     * @author liliang
     * @date 2019年12月16日
     * @param workerId 终端ID
     * @param datacenterId 数据中心ID
     */
    public static long getSnowflakeId(long workerId, long datacenterId){
        String key = workerId+":"+datacenterId;
        Snowflake snowflake = snowflakeMap.get(key);
        if(snowflake == null){
            Snowflake newSnowflake = new Snowflake(workerId, datacenterId);
          //putIfAbsent:如果不存在（新的entry），那么会向map中添加该键值对，并返回null
            //如果已经存在，那么不会覆盖已有的值，直接返回已经存在的值
            snowflake = snowflakeMap.putIfAbsent(key, newSnowflake);
            if(snowflake == null)
                snowflake = newSnowflake;
        }
        return snowflake.nextId();
        
    }
    
    /**
     * 通过默认终端Id与指定数据中心Id生成雪花算法生成的ID
     * @author liliang
     * @date 2019年12月16日
     * @param datacenterId 数据中心Id
     * @return
     */
    public static long getDefaultSnowflakeId() {
        return defaultSnowflake.nextId();
    }

    
}
